#pragma once

#include <optional>
#include <QString>
#include "../nlohmann/json.hpp"

using json = nlohmann::json;

class SystemLog {
public:
    std::optional<long long> logId;
    std::optional<std::string> timestamp;
    std::optional<std::string> logType;
    std::optional<std::string> logLevel;
    std::optional<std::string> content;
    std::optional<int> userId;
    std::optional<int> deviceId;

    json toJson() const {
        json j;
        j["logId"] = logId ? json(*logId) : json(nullptr);
        j["timestamp"] = timestamp ? json(*timestamp) : json(nullptr);
        j["logType"] = logType ? json(*logType) : json(nullptr);
        j["logLevel"] = logLevel ? json(*logLevel) : json(nullptr);
        j["content"] = content ? json(*content) : json(nullptr);
        j["userId"] = userId ? json(*userId) : json(nullptr);
        j["deviceId"] = deviceId ? json(*deviceId) : json(nullptr);
        return j;
    }

    static SystemLog fromJson(const json &j) {
        SystemLog l;
        if (j.contains("logId") && !j["logId"].is_null()) l.logId = j["logId"].get<long long>();
        if (j.contains("timestamp") && !j["timestamp"].is_null()) l.timestamp = j["timestamp"].get<std::string>();
        if (j.contains("logType") && !j["logType"].is_null()) l.logType = j["logType"].get<std::string>();
        if (j.contains("logLevel") && !j["logLevel"].is_null()) l.logLevel = j["logLevel"].get<std::string>();
        if (j.contains("content") && !j["content"].is_null()) l.content = j["content"].get<std::string>();
        if (j.contains("userId") && !j["userId"].is_null()) l.userId = j["userId"].get<int>();
        if (j.contains("deviceId") && !j["deviceId"].is_null()) l.deviceId = j["deviceId"].get<int>();
        return l;
    }
};
